#include "ModificacionCheque.h"
#include "ui_ModificacionCheques.h"

// ModificacionCheque
extern QSqlDatabase enjoylifedb;
extern QSqlRelationalTableModel  *cheques_model;
extern QTableView *cheques_view;
// MovimientosModule
extern QSqlRelationalTableModel  *movimientos_model;
extern QTableView *movimientos_view;
extern QLineEdit *saldo_line1;
extern QTabWidget *tab;
extern bool movimientosModuleBool;
extern int movimientosModuleIndex;

/*
 * Constructor de la clase ModificacionCheque.
 */
ModificacionCheque::ModificacionCheque(QWidget *parent) :
    QWidget(parent),
    cheq_model(new QSqlRelationalTableModel(this)),
    ui(new Ui::ModificacionCheques)
{
    ui->setupUi(this);

    setWindowFlags(Qt::WindowMinimizeButtonHint);
    setWindowFlags(Qt::WindowCloseButtonHint);

    cheq_model->setTable("cheque");

    CargarPersonas();
    CargarConceptos();

    ui->comboBox_Persona->setFocus();

    connect(ui->guardarBtn,SIGNAL(clicked()),this,SLOT(GuardarBtn()));
    connect(ui->cerrarBtn,SIGNAL(clicked()),this,SLOT(CerrarBtn()));

    // Definición de acceso directo para guardar cambios.".
    QShortcut* shortcutGuardar = new QShortcut(QKeySequence(Qt::Key_Return), this);
    connect(shortcutGuardar, SIGNAL(activated()), this, SLOT(GuardarBtn()));
    // Definición de acceso directo para Cancelar cambios.".
    QShortcut* shortcutCancelar = new QShortcut(QKeySequence(Qt::Key_Escape), this);
    connect(shortcutCancelar, SIGNAL(activated()), this, SLOT(close()));
}

/**
 * @brief ModificacionCheque::~ModificacionCheque
 * Destructor de la clase ModificacionCheque.
 */
ModificacionCheque::~ModificacionCheque()
{
    delete ui;
}

/**
 * @brief CargarPersonas
 * Carga personas en el combobox
 */
void ModificacionCheque::CargarPersonas()
{
    // Carga las personas de la pabla persona
    QSqlQuery *query2 = new QSqlQuery(enjoylifedb);
    QString stm2= "select persona from persona where estado is null or estado <> 'BAJA' order by persona";

    if (! query2->exec(stm2)) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, "
                              "intentelo manualmente || " + query2->lastError().text());
        return;
    }
    ui->comboBox_Persona->addItem("");
    while (query2->next()) {
        ui->comboBox_Persona->addItem(query2->value(query2->record().indexOf("persona")).toString());
    }
}

/**
 * @brief AltaCheque::CargarConceptos
 * Carga conceptos en el combobox
 */
void ModificacionCheque::CargarConceptos()
{
    // Carga las personas de la pabla cliente
    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString stm = "select concepto from concepto where tipo_concepto = 'Cliente' order by concepto";

    if (! query->exec(stm)) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros de conceptos, "
                              "intentelo nuevamente || " + query->lastError().text());
        return;
    }
    ui->comboBox_concepto->addItem("");
    while (query->next()) {
        ui->comboBox_concepto->addItem(query->value(query->record().indexOf("concepto")).toString());
    }
}

/*
 * Obtiene la información del cheque elegido desde el modulo
 */
void ModificacionCheque::GetChequesInfo(int i)
{
    row = i;
    ui->nroCheque->setText(cheques_model->index(i, 1).data().toString());
    ui->banco->setText(cheques_model->index(i, 2).data().toString());
    ui->fecha_recibido->setDate(cheques_model->index(i, 3).data().toDate());
    ui->fecha_cobro->setDate(cheques_model->index(i, 4).data().toDate());
    ui->comboBox_Persona->setCurrentText(cheques_model->index(i, 5).data().toString());
    ui->comboBox_concepto->setCurrentText(cheques_model->index(i, 6).data().toString());
    ui->monto->setText(cheques_model->index(i, 7).data().toString());

    if (cheques_model->index(row, 8).data().toString() != "SI") {
        ui->nroCheque->setEnabled(true);
    }
}

/*
 * Guarda los cambios efectuados en el movimiento.
 */
void ModificacionCheque::GuardarBtn()
{
    QString cobrado, nro_Cheque, claves;
    cobrado = cheques_model->index(row, 8).data().toString();
    nro_Cheque = cheques_model->index(row, 1).data().toString();

    QMessageBox::StandardButton button;
    if (cobrado == "SI") {
        button = QMessageBox::question(this, tr("Modificar Cheque"),
                                       tr("El cheque que desea modificar está marcado como cobrado! "
                                          "Si se modifica será modificado automaticamente en la planilla de movimientos. "
                                          "\n¿Desea continuar?"),
                                       QMessageBox::Yes | QMessageBox::No);
    } else {
        button = QMessageBox::question(this, tr("Modificar Cheque"),
                                       tr("¿Está seguro que quiere modificar este cheque?"),
                                       QMessageBox::Yes | QMessageBox::No);
    }

    if (button == QMessageBox::Yes) {
        QString filter = "id_cheque = '" + cheques_model->index(row, 0).data().toString() + "'";
        cheques_model->setFilter(filter);
        enjoylifedb.transaction();
        if (!(cheques_model->select())) {
            QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
            enjoylifedb.rollback();
            return;
        }
        enjoylifedb.commit();
        if (cheques_model->rowCount() == 1) {
            QSqlRecord record = cheques_model->record(0);

            if (cobrado != "SI") {
                if (ui->nroCheque->text().isEmpty()) {
                    QMessageBox::warning(this,"Advertencia!", "El campo Nro. Cheque no puede ser vacío");
                    return;
                } else
                    record.setValue("nro_cheque", ui->nroCheque->text());

                // Se genera el strign para modificar el movimiento
                claves = "fecha_mov='"+ui->fecha_recibido->text()+"', ";
                claves = claves + "m_persona='"+ui->comboBox_Persona->itemText(ui->comboBox_Persona->currentIndex())+"', ";
                claves = claves + "m_concepto='"+ui->comboBox_concepto->itemText(ui->comboBox_concepto->currentIndex())+"', ";
                claves = claves + "tipo_moneda='Cheque', ";
                claves = claves + "idMoneda='"+ui->nroCheque->text()+"', ";
                claves = claves + "debe='"+ui->monto->text()+"', ";
                claves = claves + "haber='0.00' ";
            } else {
                // Se genera el strign para modificar el movimiento
                claves = "fecha_mov='"+ui->fecha_recibido->text()+"', ";
                claves = claves + "m_persona='"+ui->comboBox_Persona->itemText(ui->comboBox_Persona->currentIndex())+"', ";
                claves = claves + "m_concepto='"+ui->comboBox_concepto->itemText(ui->comboBox_concepto->currentIndex())+"', ";
                claves = claves + "tipo_moneda='Cheque', ";
//                claves = claves + "idMoneda='"+ui->nroCheque->text()+"', ";
                claves = claves + "debe='"+ui->monto->text()+"', ";
                claves = claves + "haber='0.00' ";
            }

            if (ui->comboBox_Persona->itemText(ui->comboBox_Persona->currentIndex()).isEmpty()) {
                QMessageBox::warning(this,"Advertencia!", "El campo Persona no puede ser vacío");
                return;
            } else
                record.setValue("c_persona", ui->comboBox_Persona->itemText(ui->comboBox_Persona->currentIndex()));

            if (ui->comboBox_concepto->itemText(ui->comboBox_concepto->currentIndex()).isEmpty()) {
                QMessageBox::warning(this,"Advertencia!", "El campo Concepto no puede ser vacío");
                return;
            } else
                record.setValue("c_concepto", ui->comboBox_concepto->itemText(ui->comboBox_concepto->currentIndex()));

            if (ui->banco->text().isEmpty()) {
                QMessageBox::warning(this,"Advertencia!", "El campo Banco no puede ser vacío");
                return;
            } else
                record.setValue("banco", ui->banco->text());

            record.setValue("fecha_recibido", ui->fecha_recibido->text());
            record.setValue("fecha_cobro", ui->fecha_cobro->text());

            if (ui->monto->text().isEmpty()) {
                QMessageBox::warning(this,"Advertencia!", "El campo Monto no puede ser vacío");
                return;
            } else
                record.setValue("monto", ui->monto->text());

            cheques_model->setRecord(0, record);
            enjoylifedb.transaction();
            if (!cheq_model->submitAll()) {
                QString error = cheq_model->lastError().text();
                QMessageBox::critical(this,"Error!", tr("No se pudo guardar los cambios realizados, intentelo de nuevo."
                                                        "\n %1").arg(error));
                enjoylifedb.rollback();
                return;
            }
            // Se modifica el cheque en los movimientos si está marcado como cobrado
            if (cobrado == "SI") {
                QSqlQuery *query = new QSqlQuery(enjoylifedb);
                QString stm = "update movimiento set " + claves + " where idMoneda = '" + nro_Cheque + "'";
                if (! query->exec(stm)) {
                    QMessageBox::critical(this,"Error!", "No se pudo remover el cheque de los movimientos, "
                                          "intentelo nuevamente || " + query->lastError().text());
                    enjoylifedb.rollback();
                    return;
                }
            }
            enjoylifedb.commit();
        }
        else {
            QMessageBox::critical(this,"Error!", tr("No se pudo recuperar los datos del cheque, intentelo de nuevo."));
            enjoylifedb.rollback();
        }
    }
    else
        return;

    UpdateChequesList();
    CorrectViewOfModel();

    close();
}

/*
 * Cancela la modificación del movimiento.
 */
void ModificacionCheque::CerrarBtn()
{
    enjoylifedb.transaction();
    if (!(cheques_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    hide();
    close();
}

/*
 * Acción del boton: Actualiza la lista de cheques.
 */
void ModificacionCheque::UpdateChequesList()
{
    enjoylifedb.transaction();
    cheques_model->setTable("cheque");
    if (!(cheques_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    CorrectViewOfModel();
}

/*
 * Acomoda la vista del modulo Movimientos.
 */
void ModificacionCheque::CorrectViewOfModel()
{
    cheques_model->setHeaderData(0,Qt::Horizontal,"ID Cheque");
    cheques_model->setHeaderData(1,Qt::Horizontal,"Nro. Cheque");
    cheques_model->setHeaderData(2,Qt::Horizontal,"Banco");
    cheques_model->setHeaderData(3,Qt::Horizontal,"Fecha Recibido");
    cheques_model->setHeaderData(4,Qt::Horizontal,"Fecha Cobro");
    cheques_model->setHeaderData(5,Qt::Horizontal,"Persona");
    cheques_model->setHeaderData(6,Qt::Horizontal,"Concepto");
    cheques_model->setHeaderData(7,Qt::Horizontal,"Monto");

    cheques_view->setModel(cheques_model);
    cheques_view->setCornerButtonEnabled(true);
    cheques_view->setAlternatingRowColors(true);
    cheques_view->setGridStyle(Qt::SolidLine);
    cheques_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    cheques_view->setWordWrap(true);
    cheques_view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    cheques_view->sortByColumn(1,Qt::SortOrder());
    cheques_view->hideColumn(8);

//    cheques_view->setColumnWidth(0,90);
//    cheques_view->setColumnWidth(1,90);
//    cheques_view->setColumnWidth(2,90);
//    cheques_view->setColumnWidth(3,330);
//    cheques_view->setColumnWidth(4,330);
//    cheques_view->setColumnWidth(5,100);
    cheques_view->scrollToBottom();
}

// Funciones para actualizar correctamente la vista y el saldo en movimientos

///*
// * Acción del boton: Actualiza la lista de moviemientos.
// */
//void ModificacionCheque::UpdateMovimientosList()
//{
//    QDate date;
//    date.setDate(date.currentDate().year(),date.currentDate().month(),date.currentDate().day());
//    QString formatYear = "yyyy";
//    QString formatMonth = "MM";
//    QString anio, mes;
//    anio = date.toString(formatYear);
//    mes = date.toString(formatMonth);

//    QString filtroMov;
//    filtroMov = "date_part('year', fecha_mov) = '" + anio + "'";
//    filtroMov = filtroMov + " and date_part('month', fecha_mov) = '" + mes + "'";
//    movimientos_model->setTable("movimiento");
//    movimientos_model->filter().clear();
//    movimientos_model->setFilter(filtroMov);
//    if (!(movimientos_model->select())) {
//        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
//        enjoylifedb.rollback();
//        return;
//    }
//    enjoylifedb.commit();
//    CorrectViewOfModelMov();
//    CalcularSaldoMensual();
//}

///*
// * Acomoda la vista del modulo Movimientos.
// */
//void ModificacionCheque::CorrectViewOfModelMov()
//{
//    movimientos_model->setHeaderData(1,Qt::Horizontal,"Fecha");
//    movimientos_model->setHeaderData(2,Qt::Horizontal,"Persona");
//    movimientos_model->setHeaderData(3,Qt::Horizontal,"Concepto");
//    movimientos_model->setHeaderData(4,Qt::Horizontal,"Tipo Moneda");
//    movimientos_model->setHeaderData(6,Qt::Horizontal,"Debe");
//    movimientos_model->setHeaderData(7,Qt::Horizontal,"Haber");

//    movimientos_view->setModel(movimientos_model);
//    movimientos_view->setCornerButtonEnabled(true);
//    movimientos_view->setAlternatingRowColors(true);
//    movimientos_view->setGridStyle(Qt::SolidLine);
//    movimientos_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
//    movimientos_view->setWordWrap(true);
//    movimientos_view->resizeColumnsToContents();
//    movimientos_view->sortByColumn(1,Qt::SortOrder());
//    movimientos_view->hideColumn(0);
//    movimientos_view->hideColumn(5);
//    movimientos_view->hideColumn(8);
//}

///*
// *
// */
//void ModificacionCheque::CalcularSaldoMensual()
//{
//    QDate date;
//    date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
//    QString formatYear = "yyyy";
//    QString formatMonth = "MM";
//    QString anio, mes;
//    anio = date.toString(formatYear);
//    mes = date.toString(formatMonth);
//    QString filtroMov;
//    filtroMov = "date_part('year', fecha_mov) = '" + anio + "'";
//    filtroMov = filtroMov + " and date_part('month', fecha_mov) = '" + mes + "'";

//    enjoylifedb.transaction();
//    QSqlQuery *query = new QSqlQuery(enjoylifedb);
//    QString stm = "select sum(debe) as sumDebe, sum(haber) as sumHaber from movimiento where " + filtroMov;
//    if (! query->exec(stm)) {
//        QMessageBox::critical(this,"Error!", "No se pudo recuperar los datos necesarios para calcular el saldo actual, "
//                              "intentelo nuevamente || " + query->lastError().text());
//        enjoylifedb.rollback();
//        return;
//    }

//    double sumDebe, sumHaber;
//    while (query->next()) {
//        if (query->last()) {
//            sumDebe = query->value(query->record().indexOf("sumDebe")).toDouble();
//            sumHaber = query->value(query->record().indexOf("sumHaber")).toDouble();
//        }
//    }
//    QVariant val = sumDebe - sumHaber;
//    const int precision = 2;
//    saldo_line1->setText(QString("%1").arg(val.toDouble(), 0, 'f', precision));

//    enjoylifedb.commit();
//}
